#ifndef Transformation_H_
#define Transformation_H_
//g2o
#include "g2o/core/graph_optimizer_sparse.h"
#include "g2o/core/hyper_graph.h"
#include "g2o/core/block_solver.h"
#include "g2o/core/solver.h"
#include "g2o/solvers/pcg/linear_solver_pcg.h"
#include "g2o/math_groups/se3quat.h"
#include "g2o/core/structure_only_solver.h"
#include "g2o/types/slam3d/vertex_se3_quat.h"
#include "g2o/types/slam3d/edge_se3_quat.h"

//other
#include <stdio.h>
#include <string.h>
#include "RGBDFrame.h"
//#include "FrameMatcher.h"
//#include "RGBDCamera.h"
//#include "myutils.h"
#include <string>
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/registration/icp.h>
#include <pcl/filters/passthrough.h>
#include "KeyPointSet.h"

class FrameNode;
class Transformation {
	public:
		Transformation * next;
		Transformation * prev;
		FrameNode * src;
		FrameNode * dst;
		Eigen::Matrix4f transformationMatrix;
		KeyPoint ** matches_src;
		KeyPoint ** matches_dst;
		int nr_matches;
		double weight;
		int level;
		g2o::EdgeSE3 * g2oEdge;
//		void print();
//		void display();
//		void displayDifference(Transformation * transformation);
//		void store(string path);
//		void load(string path, FrameNode ** nodes);
	public:
		EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
#endif
